// EDITOR CONSTRUCTOR

import { CodeMirror } from './CodeMirror.js';
export { CodeMirror } from './CodeMirror.js';

import { eventMixin } from '../util/event.js';
import { indexOf } from '../util/misc.js';

import { defineOptions } from './options.js';

defineOptions(CodeMirror);

import addEditorMethods from './methods.js';

addEditorMethods(CodeMirror);

import Doc from '../model/Doc.js';

// Set up methods on CodeMirror's prototype to redirect to the editor's document.
let dontDelegate = 'iter insert remove copy getEditor constructor'.split(' ');
for (let prop in Doc.prototype)
  if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0)
    CodeMirror.prototype[prop] = (function (method) {
      return function () {
        return method.apply(this.doc, arguments);
      };
    })(Doc.prototype[prop]);

eventMixin(Doc);

// INPUT HANDLING

import ContentEditableInput from '../input/ContentEditableInput.js';
import TextareaInput from '../input/TextareaInput.js';
CodeMirror.inputStyles = { textarea: TextareaInput, contenteditable: ContentEditableInput };

// MODE DEFINITION AND QUERYING

import { defineMIME, defineMode } from '../modes.js';

// Extra arguments are stored as the mode's dependencies, which is
// used by (legacy) mechanisms like loadmode.js to automatically
// load a mode. (Preferred mechanism is the require/define calls.)
CodeMirror.defineMode = function (name /*, mode, …*/) {
  if (!CodeMirror.defaults.mode && name != 'null') CodeMirror.defaults.mode = name;
  defineMode.apply(this, arguments);
};

CodeMirror.defineMIME = defineMIME;

// Minimal default mode.
CodeMirror.defineMode('null', () => ({ token: stream => stream.skipToEnd() }));
CodeMirror.defineMIME('text/plain', 'null');

// EXTENSIONS

CodeMirror.defineExtension = (name, func) => {
  CodeMirror.prototype[name] = func;
};
CodeMirror.defineDocExtension = (name, func) => {
  Doc.prototype[name] = func;
};

import { fromTextArea } from './fromTextArea.js';

CodeMirror.fromTextArea = fromTextArea;

import { addLegacyProps } from './legacy.js';

addLegacyProps(CodeMirror);

CodeMirror.version = '5.62.3';
